/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.upc.upcdewtaxiremisse.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import pe.edu.upc.upcdewtaxiremisse.model.Chofer;
import pe.edu.upc.upcdewtaxiremisse.model.Cliente;
import pe.edu.upc.upcdewtaxiremisse.model.Distrito;
import pe.edu.upc.upcdewtaxiremisse.model.Servicio;
import pe.edu.upc.upcdewtaxiremisse.model.Tarifa;
import pe.edu.upc.upcdewtaxiremisse.model.Unidad;
import pe.edu.upc.upcdewtaxiremisse.model.Usuario;
import pe.edu.upc.upcdewtaxiremisse.util.Constantes;

/**
 *
 * @author dsilva
 */
public class DerbyTaxiDao implements TaxiDao {

    private JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource ds) {
        jdbcTemplate = new JdbcTemplate(ds);
    }

    public List<Servicio> getServicios(Servicio bean) {
        /* El mapeo para cada fila del resultado del query*/
        RowMapper mapper = new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                //se lee cada campo como en el while de un ResultSet comun de JDBC
                SimpleDateFormat sdf = new SimpleDateFormat(Constantes.FORMATO_FECHA);
                SimpleDateFormat sdf2 = new SimpleDateFormat(Constantes.FORMATO_FECHA_HORA);
                Servicio servicio = new Servicio();
                servicio.setFechaProgramacion(rs.getDate("FechaProgramacion") != null ? sdf.format(rs.getDate("FechaProgramacion")) : null);
                servicio.setFechaRegistro(rs.getDate("FechaRegistro") != null ? sdf.format(rs.getDate("FechaRegistro")) : null);
                servicio.setFechaRecojo(rs.getDate("FechaRecojo") != null ? sdf.format(rs.getDate("FechaRecojo")) : null);
                servicio.setDireccionOrigen(rs.getString("DireccionOrigen"));
                servicio.setDireccionDestino(rs.getString("DireccionDestino"));
                servicio.setIdServicio(rs.getInt("IdServicio"));
                servicio.setTipodeServicio(rs.getString("TipoServicio"));
                servicio.setEstadodeWorkFlow(rs.getString("EstadoWorkFlow"));

                Cliente cliente = new Cliente();
                cliente.setIdCliente(rs.getString("IdCliente"));
                cliente.setNombre(rs.getString("NombreCliente"));

                Unidad unidad = new Unidad();
                unidad.setPlaca(rs.getString("Placa"));
                unidad.setMarca(rs.getString("marca"));

                Chofer chofer = new Chofer();
                chofer.setIdChofer(rs.getString("IdChofer"));
                chofer.setNombre(rs.getString("NombreChofer"));

                Tarifa tarifa = new Tarifa();
                tarifa.setIdTarifa(rs.getInt("IdTarifa"));
                tarifa.setImporte(rs.getFloat("ImporteTarifa"));
                tarifa.setIdDistritoOrigen(new Distrito(rs.getString("IdDistritoOrigen"), rs.getString("NombreDistritoOrigen")));
                tarifa.setIdDistritoDestino(new Distrito(rs.getString("IdDistritoDestino"), rs.getString("NombreDistritoDestino")));

                servicio.setCliente(cliente);
                servicio.setUnidad(unidad);
                servicio.setChofer(chofer);
                servicio.setTarifa(tarifa);
                return servicio;
            }
        };
        //ejecuta la consulta, y lo devuelve en una lista de objetos.
        String sql = "SELECT a.*,b.NOMBRE AS NombreCliente,d.IDDISTRITOORIGEN,d.IDDISTRITODESTINO, "
                + "g.NOMBRE AS NOMBREDISTRITOORIGEN,  h.NOMBRE AS NOMBREDISTRITODESTINO,"
                + "b.NOMBRE AS NOMBRECLIENTE,f.NOMBRE AS NOMBRECHOFER, e.MARCA, d.IMPORTE AS IMPORTETARIFA "
                + "FROM servicio a "
                + "INNER JOIN cliente b on a.IDCLIENTE = b.IDCLIENTE "
                + "INNER JOIN tarifa d ON a.IDTARIFA = d.IDTARIFA "
                + "LEFT JOIN unidad e ON a.PLACA = e.PLACA "
                + "LEFT JOIN chofer f ON a.IDCHOFER = f.IDCHOFER "
                + "INNER JOIN distrito g ON d.IDDISTRITOORIGEN = g.IDDISTRITO "
                + "INNER JOIN distrito h ON d.IDDISTRITODESTINO = h.IDDISTRITO where (a.EstadoWorkFlow not in('L') or ESTADOWORKFLOW is null) ";
        List parameters = new ArrayList();
        if (bean.getFechaProgramacion() != null) {
            SimpleDateFormat sdf = new SimpleDateFormat(Constantes.FORMATO_FECHA);
            try {
                sql = sql + " and a.FechaProgramacion = ?";
                parameters.add(sdf.parse(bean.getFechaProgramacion()));
            } catch (Exception ex) {
            }
        }
        /*if (bean.getEstadodeWorkFlow() != null) {
            sql = sql + " and a.EstadoWorkFlow = ?";
            parameters.add(new String(bean.getEstadodeWorkFlow()));
        }*/
        List<Servicio> list = jdbcTemplate.query(sql, parameters.toArray(), mapper);

        return list;
    }

    public void updateEstadoServicio(Servicio bean) {
        this.jdbcTemplate.update("UPDATE SERVICIO SET EstadoWorkFlow = ?, Placa = ? WHERE IdServicio = ?",
                new Object[]{
                    new String(bean.getEstadodeWorkFlow()),
                    new String(bean.getUnidad().getPlaca()),
                    new Integer(bean.getIdServicio())
                });
        //if (bean.getEstadodeWorkFlow().equals(Constantes.ESTADO_LIBRE)) {
        this.jdbcTemplate.update("UPDATE UNIDAD SET EstadoUnidad = ? WHERE Placa = ?",
                new Object[]{
                    new String(bean.getEstadodeWorkFlow()),
                    new String(bean.getUnidad().getPlaca())
                });
        //}
    }

    public void insertServicio(Servicio bean) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat(Constantes.FORMATO_FECHA);
        int codigo = (Integer) this.jdbcTemplate.queryForObject("SELECT MAX(IdServicio) from SERVICIO ", Integer.class);

        this.jdbcTemplate.update("INSERT INTO SERVICIO (IdServicio,IdCliente,IdTarifa,IdChofer,FechaProgramacion,FechaRegistro,FechaRecojo,DireccionOrigen,DireccionDestino,TipoServicio,Importe,IdUsuario) "
                + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
                new Object[]{
                    new Integer(codigo + 1),
                    new String(bean.getCliente().getIdCliente()),
                    new Integer(bean.getTarifa().getIdTarifa()),
                    new String(bean.getChofer().getIdChofer()),
                    sdf.parse(bean.getFechaProgramacion()),
                    sdf.parse(bean.getFechaRegistro()),
                    sdf.parse(bean.getFechaRecojo()),
                    new String(bean.getDireccionOrigen()),
                    new String(bean.getDireccionDestino()),
                    new String(bean.getTipodeServicio()),
                    bean.getTarifa().getImporte(),
                    new String(bean.getUsuario().getIdUsuario())
                });
    }

    public List<Distrito> getDistritos() {
        RowMapper mapper = new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Distrito distrito = new Distrito(rs.getString("IdDistrito"), rs.getString("Nombre"));
                return distrito;
            }
        };
        List<Distrito> list = jdbcTemplate.query("SELECT * FROM Distrito", mapper);

        return list;
    }

    public List<Unidad> getUnidades(Unidad bean) {
        RowMapper mapper = new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Unidad unidad = new Unidad();
                unidad.setPlaca(rs.getString("Placa"));
                unidad.setColor(rs.getString("Color"));
                unidad.setMarca(rs.getString("Marca"));
                unidad.setEstadoUnidad(rs.getString("EstadoUnidad"));
                Chofer chofer = new Chofer();
                chofer.setIdChofer(rs.getString("IdChofer"));
                chofer.setNombre(rs.getString("NombreChofer"));
                unidad.setChofer(chofer);
                return unidad;
            }
        };
        String sql = "SELECT a.*, b.nombre as NombreChofer FROM unidad a, chofer b where a.IdChofer = b.IdChofer ";
        List parameters = new ArrayList();
        if (bean != null) {
            if (bean.getEstadoUnidad() != null) {
                sql = sql + " and a.EstadoUnidad = ?";
                parameters.add(bean.getEstadoUnidad());
            }
        }

        List<Unidad> list = jdbcTemplate.query(sql, parameters.toArray(), mapper);
        return list;
    }

    public List<Tarifa> getTarifas(Tarifa bean) {
        RowMapper mapper = new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Tarifa tarifa = new Tarifa();
                tarifa.setIdTarifa(rs.getInt("IdTarifa"));
                tarifa.setIdDistritoOrigen(new Distrito(rs.getString("IdDistritoOrigen")));
                tarifa.setIdDistritoDestino(new Distrito(rs.getString("IdDistritoDestino")));
                tarifa.setTipodeUnidad(rs.getString("TipoVehiculo"));
                tarifa.setImporte(rs.getFloat("Importe"));
                return tarifa;
            }
        };
        String sql = "SELECT * FROM Tarifa where 1=1 ";
        List parameters = new ArrayList();
        if (bean != null) {
            if (bean.getIdDistritoOrigen() != null) {
                sql = sql + " and IdDistritoOrigen = ? ";
                parameters.add(new String(bean.getIdDistritoOrigen().getIdDistrito()));
            }
            if (bean.getIdDistritoDestino() != null) {
                sql = sql + " and IdDistritoDestino = ? ";
                parameters.add(new String(bean.getIdDistritoDestino().getIdDistrito()));
            }
            if (bean.getTipodeUnidad() != null) {
                sql = sql + " and TipoVehiculo = ? ";
                parameters.add(new String(bean.getTipodeUnidad()));
            }
        }
        List<Tarifa> list = jdbcTemplate.query(sql, parameters.toArray(), mapper);

        return list;
    }

    public Usuario getUsuario(Usuario bean) {
        RowMapper mapper = new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getString("IdUsuario"));
                usuario.setPassword(rs.getString("Password"));
                usuario.setNombre(rs.getString("Nombre"));
                return usuario;
            }
        };
        String sql = "SELECT * FROM usuario where IdUsuario = ? and Password = ? ";
        List parameters = new ArrayList();
        parameters.add(bean.getIdUsuario());
        parameters.add(bean.getPassword());

        List<Usuario> list = ((List<Usuario>) jdbcTemplate.query(sql, parameters.toArray(), mapper));
        if(!list.isEmpty()){
            return list.get(0);
        }else{
            return null;
        }
        
    }

    public Cliente getCliente(Cliente bean) {
        RowMapper mapper = new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Cliente cliente = new Cliente();
                cliente.setIdCliente(rs.getString("IdCliente"));
                cliente.setTelefono(rs.getString("Telefono"));
                cliente.setNombre(rs.getString("Nombre"));
                return cliente;
            }
        };
        String sql = "SELECT * FROM cliente where IdCliente = ?";
        List parameters = new ArrayList();
        parameters.add(bean.getIdCliente());

        List<Cliente> list = ((List<Cliente>) jdbcTemplate.query(sql, parameters.toArray(), mapper));
        if(!list.isEmpty()){
            return list.get(0);
        }else{
            return null;
        }
    }

    public List<Chofer> getChoferes() {
        RowMapper mapper = new RowMapper() {

            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                Chofer chofer = new Chofer(rs.getString("Idchofer"), rs.getString("Nombre"));
                return chofer;
            }
        };
        List<Chofer> list = jdbcTemplate.query("SELECT * FROM Chofer", mapper);

        return list;
    }
}
